package com.wmx.hb.mapper;

import com.wmx.hb.pojo.Dept;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 部门实体对应的方法映射.
 * <p>
 * 无论是注解版还是配置版，都需要要为 Mapper 接口指定 @Mapper 注解，或者使用 @MapperScan 扫描所有 Mapper 接口
 * 当使用 @MapperScan 扫描 Mapper 接口时，接口上 @Mapper 注解可以不写.
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2021/7/4 16:25
 */
public interface DeptMapper {

    /**
     * 根据 id 查询
     */
    Dept findDeptById(Integer deptno);

    /**
     * 分页查询
     *
     * @param paramMap
     * @return
     */
    List<Dept> findByLimit(Map<String, Object> paramMap);

    /**
     * 查询表中的数据总条数
     */
    long countForTable();

    /**
     * 查询所有部门的名称
     *
     * @return
     */
    List<String> findAllNames();

    /**
     * 查询所有
     */
    List<Dept> findAllDepts();

    /**
     * 根据关键字模糊查询，默认查询所有————一对多关联查询部门下的员工信息
     *
     * @param keyword
     * @return
     */
    List<Dept> findByKeyword(String keyword);

    /**
     * 根据主键 id集合查询
     *
     * @param deptnos
     * @return
     */
    List<Dept> findByDeptnos(List<Integer> deptnos);

    /**
     * 查询指定部门的信息，以及部门下的所有人员信息.
     *
     * @param deptno
     * @return
     */
    List<Map<String, Object>> findDeptEmp(Integer deptno);

    /**
     * 1、查询指定部门的信息，将实体对象中不为空的属性都作为 where 条件，默认查所有。
     * 2、使用 org.apache.ibatis.annotations.Param 注解可以为 XxxMapper 接口方法指定多个参数。
     * 3、多个参数会被封装成一个 map，map 的 key 是使用 @Param 注解指定的值，value 是参数值。
     * 4、如果是级联对象，则 XxxMapper.xml 映射文件中得级联取值，如 dept.deptno、dept.dname，前提是 dept 不能为 null，否则异常.
     *
     * @param dept
     * @param pageNum  ：查询的页码，从1开始
     * @param pageSize ：每页显示的条数
     * @return
     */
    List<Dept> findByDept(@Param("dept") Dept dept, @Param("pageNum") int pageNum, @Param("pageSize") int pageSize);

    /**
     * 查询指定部门的信息，将实体对象中不为空的属性都作为 where 条件，默认查所有
     *
     * @param dept
     * @return
     */
    List<Dept> loadByDept(Dept dept);

    /**
     * 根据 id 删除
     */
    Integer deleteDeptById(Integer deptno);

    /**
     * 添加部门信息
     *
     * @param dept
     * @return ：默认返回影响的条数
     */
    Integer addDept(Dept dept);

    /**
     * 修改
     *
     * @param dept
     * @return
     */
    Integer updateDept(Dept dept);

    /**
     * 根据主键id修改部门信息，只修改不为null，且不为空的属性
     *
     * @param dept
     * @return
     */
    Integer updateDeptByNotNull(Dept dept);

    /**
     * 根据主键id修改部门信息，只修改不为null，且不为空的属性
     *
     * @param dept
     * @return
     */
    Integer modifyDeptByNotNull(Dept dept);
}
